/**
 * 问题:
 * 实现一个unflatten方法, 将对象反扁平化
 * 
 * 描述:
 * const obj = { 
 *   'a.b': 1, 
 *   'a.c': 2, 
 *   'a.d.e': 5, 
 *   'b[0]': 1, 
 *   'b[1]': 3, 
 *   'b[2].a': 2, 
 *   'b[2].b': 3, 
 *   'c': 3 
 * }
 * 
 * unflatten(obj) 结果返回如下
 * { 
 *   a: { b: 1, c: 2, d: {e: 5} }, 
 *   b: [1, 3, {a: 2, b: 3}], 
 *   c: 3 
 * }
*/


const obj = {
  'a.b': 1,
  'a.c': 2,
  'a.d.e': 5,
  'b.[0]': 1,
  'b.[1]': 3,
  'b.[2].a': 2,
  'b.[2].b': 3,
  c: 3
}

/**
 * @param {Object} data 传入的对象
 * @returns {Object} 反扁平后的对象
 */

function unflatten(data) {
  if(Object(data) !== data || Array.isArray(data)) {
    return data;
  }

  const regex = /\.?([^.\[\]]+)|\[(\d+)\]/g
  const result = {};

  for (var key in data) {
      let cur = result, prop = '', match;
      while (match = regex.exec(key)) {
          cur = cur[prop] || (cur[prop] = (match[2] ? [] : {}));
          prop = match[2] || match[1];
      }
      cur[prop] = data[key];
  }
  return result[''] || result;
}

const res = unflatten(obj)
console.log(res)
// { 
//   a: { b: 1, c: 2, d: { e: 5 } }, 
//   b: [ 1, 3, { a: 2, b: 3 } ], 
//   c: 3 
// }
